package com.wenx.v3system.modular.cloud.service;

import com.baomidou.mybatisplus.extension.service.IService;
import com.wenx.base.rest.BaseRestService;
import com.wenx.v3system.modular.cloud.domain.dto.SysMenuDto;
import com.wenx.v3system.modular.cloud.domain.po.SysMenu;
import com.wenx.v3system.modular.cloud.domain.query.SysMenuQuery;

import java.util.List;

/**
 * 系统菜单服务接口
 * 基于Enhanced RBAC权限模型
 * 提供菜单管理、权限控制和树形结构操作
 * 
 * @author wenx
 * @since 1.0.0
 */
public interface SysMenuRestService extends IService<SysMenu>, BaseRestService<SysMenuDto, SysMenuQuery> {

    /**
     * 根据菜单编码获取菜单信息
     * 
     * @param code 菜单编码
     * @return 菜单信息，不存在返回null
     */
    SysMenuDto getMenuByCode(String code);

    /**
     * 获取用户可访问的菜单列表
     * 
     * @param userId 用户ID
     * @return 用户菜单列表
     */
    List<SysMenuDto> getUserMenus(Long userId);

    /**
     * 获取角色关联的菜单列表
     * 
     * @param roleId 角色ID
     * @return 角色菜单列表
     */
    List<SysMenuDto> getRoleMenus(Long roleId);

    /**
     * 获取菜单树形结构
     * 
     * @param parentId 父菜单ID，null表示获取根菜单
     * @return 菜单树列表
     */
    List<SysMenuDto> getMenuTree(Long parentId);

    /**
     * 获取子菜单列表
     * 
     * @param parentId 父菜单ID
     * @return 子菜单列表
     */
    List<SysMenuDto> getChildMenus(Long parentId);

    /**
     * 检查菜单编码是否存在
     * 
     * @param code 菜单编码
     * @param excludeId 排除的菜单ID
     * @return true-存在，false-不存在
     */
    boolean existsByCode(String code, Long excludeId);

    /**
     * 启用菜单
     * 
     * @param menuId 菜单ID
     */
    void enableMenu(Long menuId);

    /**
     * 禁用菜单
     * 
     * @param menuId 菜单ID
     */
    void disableMenu(Long menuId);

    /**
     * 移动菜单位置
     * 
     * @param menuId 菜单ID
     * @param targetParentId 目标父菜单ID
     * @param targetSort 目标排序
     */
    void moveMenu(Long menuId, Long targetParentId, Integer targetSort);

    /**
     * 批量更新菜单排序
     * 
     * @param menuSorts 菜单ID和排序的映射
     */
    void updateMenuSorts(List<SysMenuDto> menuSorts);
}
